package com.jshcbd.mvp_kt_demo.base.mvp

import com.jshcbd.mvp_kt_demo.ui.main.MainContract
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable

/**
 * Created by zzt
 * 2021/8/18
 */
open class BasePresenter<V : BaseView?, M : BaseModel> : IPresenter {
    protected var mView: V? = null
    protected var mModel: M? = null
    protected var mCompositeDisposable: CompositeDisposable? = null

    /**
     * 如果当前页面同时需要 Model 层和 View 层,则使用此构造函数(默认)
     *
     * @param model
     * @param view
     */
    constructor(model: M, view: V) {
        mModel = model
        mView = view
        attachView()
    }

    /**
     * 如果当前页面不需要操作数据,只需要 View 层,则使用此构造函数
     *
     * @param view
     */
    constructor(view: V) {
        mView = view
        attachView()
    }


    constructor() {
        attachView()
    }

    /**
     * 将 [Disposable] 添加到 [CompositeDisposable] 中统一管理
     * 可在  中使用 [.unDispose] 停止正在执行的 RxJava 任务,避免内存泄漏
     * 目前已使用 [RxLifecycle] 避免内存泄漏,此方法作为备用方案
     *
     * @param disposable
     */
    protected fun addDisposabel(disposable: Disposable?) {
        if (mCompositeDisposable == null) {
            mCompositeDisposable = CompositeDisposable()
        }
        //将所有 Disposable 放入集中处理
        mCompositeDisposable!!.add(disposable!!)
    }

    fun unDispose() {
        if (mCompositeDisposable != null) {
            mCompositeDisposable!!.clear() //保证 Activity 结束时取消所有正在执行的订阅
        }
    }


     override fun attachView() {

    }

    override fun detachView() {
        if (mView != null) {
            mView = null
        }
        unDispose()
    }
}